package com.idanchuang.support.etcache.remote;

import com.idanchuang.support.etcache.remote.codec.ValueCodec;

import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 远程缓存对象
 *
 * @author yjy
 * Created at 2021/12/21 12:01 下午
 */
public interface RemoteCache<K, V> {

    /**
     * 读取缓存
     * @param key ..
     * @return ..
     */
    V get(K key);

    /**
     * 批量读取缓存
     * @param keys ..
     * @return ..
     */
    Map<K, V> getAll(Iterable<K> keys);

    /**
     * 设置缓存
     * @param key ..
     * @param value ..
     */
    void set(K key, V value);

    /**
     * 设置缓存, 并设置过期时间
     * @param key ..
     * @param value ..
     * @param expire 过期时间
     * @param timeUnit 时间单位
     */
    void set(K key, V value, long expire, TimeUnit timeUnit);

    /**
     * 批量设置缓存
     * @param map 键值对集合
     */
    void setAll(Map<K, V> map);

    /**
     * 批量设置缓存, 并设置过期时间
     * @param map 键值对集合
     * @param expire 过期时间
     * @param timeUnit 时间单位
     */
    void setAll(Map<K, V> map, long expire, TimeUnit timeUnit);

    /**
     * 移除缓存
     * @param key ..
     */
    void remove(K key);

    /**
     * 批量移除缓存
     * @param keys ..
     */
    void removeAll(Iterable<K> keys);

    /**
     * 获取当前配置项
     * @return ..
     */
    RemoteCacheConfig getConfig();

    /**
     * 获取Key的编解码器
     * @return ..
     */
    ValueCodec getKeyCodec();

    /**
     * 获取Value的编解码器
     * @return ..
     */
    ValueCodec getValueCodec();

    /**
     * 销毁缓存对象
     */
    void destroy();
}
